home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / dns / ipv6.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  3KB  |  119 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import re
  5. import dns.exception as dns
  6. import dns.ipv4 as dns
  7. _leading_zero = re.compile('0+([0-9a-f]+)')
  8.  
  9. def inet_ntoa(address):
  10.     if len(address) != 16:
  11.         raise ValueError, 'IPv6 addresses are 16 bytes long'
  12.     
  13.     hex = address.encode('hex_codec')
  14.     chunks = []
  15.     i = 0
  16.     l = len(hex)
  17.     while i < l:
  18.         chunk = hex[i:i + 4]
  19.         m = _leading_zero.match(chunk)
  20.         if m is not None:
  21.             chunk = m.group(1)
  22.         
  23.         chunks.append(chunk)
  24.         i += 4
  25.     best_start = 0
  26.     best_len = 0
  27.     start = -1
  28.     last_was_zero = False
  29.     for i in xrange(8):
  30.         if chunks[i] != '0':
  31.             if last_was_zero:
  32.                 end = i
  33.                 current_len = end - start
  34.                 if current_len > best_len:
  35.                     best_start = start
  36.                     best_len = current_len
  37.                 
  38.                 last_was_zero = False
  39.             
  40.         last_was_zero
  41.         if not last_was_zero:
  42.             start = i
  43.             last_was_zero = True
  44.             continue
  45.     
  46.     if last_was_zero:
  47.         end = 8
  48.         current_len = end - start
  49.         if current_len > best_len:
  50.             best_start = start
  51.             best_len = current_len
  52.         
  53.     
  54.     if best_len > 0:
  55.         if best_start == 0:
  56.             pass
  57.         None if (best_len == 6 or best_len == 5) and chunks[5] == 'ffff' else chunks[5] == 'ffff'
  58.         hex = ':'.join(chunks[:best_start]) + '::' + ':'.join(chunks[best_start + best_len:])
  59.     else:
  60.         hex = ':'.join(chunks)
  61.     return hex
  62.  
  63. _v4_ending = re.compile('(.*):(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)$')
  64. _colon_colon_start = re.compile('::.*')
  65. _colon_colon_end = re.compile('.*::$')
  66.  
  67. def inet_aton(text):
  68.     if text == '::':
  69.         text = '0::'
  70.     
  71.     m = _v4_ending.match(text)
  72.     if m is not None:
  73.         text = '%s:%04x:%04x' % (m.group(1), int(m.group(2)) * 256 + int(m.group(3)), int(m.group(4)) * 256 + int(m.group(5)))
  74.     
  75.     m = _colon_colon_start.match(text)
  76.     if m is not None:
  77.         text = text[1:]
  78.     else:
  79.         m = _colon_colon_end.match(text)
  80.         if m is not None:
  81.             text = text[:-1]
  82.         
  83.     chunks = text.split(':')
  84.     l = len(chunks)
  85.     if l > 8:
  86.         raise dns.exception.SyntaxError
  87.     
  88.     seen_empty = False
  89.     canonical = []
  90.     for c in chunks:
  91.         if c == '':
  92.             if seen_empty:
  93.                 raise dns.exception.SyntaxError
  94.             
  95.             seen_empty = True
  96.             for i in xrange(0, (8 - l) + 1):
  97.                 canonical.append('0000')
  98.             
  99.         lc = len(c)
  100.         if lc > 4:
  101.             raise dns.exception.SyntaxError
  102.         
  103.         if lc != 4:
  104.             c = '0' * (4 - lc) + c
  105.         
  106.         canonical.append(c)
  107.     
  108.     if l < 8 and not seen_empty:
  109.         raise dns.exception.SyntaxError
  110.     
  111.     text = ''.join(canonical)
  112.     
  113.     try:
  114.         return text.decode('hex_codec')
  115.     except TypeError:
  116.         raise dns.exception.SyntaxError
  117.  
  118.  
  119.